package main

import (
	"go-step/s17_go_template/entity"
	"log"
	"os"
	"text/template"
	"time"
)

// 解析字符串 点动作
func dotOps() {
	s := "My name is {{ .Name }}. I am {{ .Age }} years old.\n"
	// 创建模板  并解析上面的s字符串
	t, err := template.New("test").Parse(s)
	if err != nil {
		log.Fatal("Parse string literal template error:", err)
	}

	u := entity.User{Name: "chauncy", Age: 18}

	// 去执行渲染  把数据按规则塞进模板
	err = t.Execute(os.Stdout, u)
	if err != nil {
		log.Fatal("Execute string literal template error:", err)
	}
}

// 条件动作
func conditionOPs() {
	t, err := template.ParseFiles("s17_go_template/template/pet.tpl")
	if err != nil {
		log.Fatal("Parse error:", err)
	}

	//rand.Seed(time.Now().Unix())
	//random := rand.New(rand.NewSource(time.Now().Unix()))

	p := entity.Pet{
		Name: "Orange",
		Age:  2,
		Owner: entity.Animal{
			Name: "ls",
			Age:  18,
		},
	}
	err = t.Execute(os.Stdout, p)
	if err != nil {
		log.Fatal("Execute error:", err)
	}
}

// 模板嵌套
func nestOps1() {
	t, err := template.ParseFiles("s17_go_template/template/tpl1.tpl", "s17_go_template/template/tpl2.tpl")
	if err != nil {
		log.Fatal("Parse error:", err)
	}
	err = t.Execute(os.Stdout, "test data")
	if err != nil {
		log.Fatal("Execute error:", err)
	}
}
func nestOps2() {
	t, err := template.ParseFiles("s17_go_template/template/layout.tpl")
	if err != nil {
		log.Fatal("Parse error:", err)
	}
	err = t.ExecuteTemplate(os.Stdout, "layout", "test data")
	if err != nil {
		log.Fatal("Execute error:", err)
	}
}
func functionOps() {
	// FullName是User结构体的函数名
	s := "My full name is {{ .FullName }}.\n"
	// 创建模板  并解析上面的s字符串
	t, err := template.New("test").Parse(s)
	//t, err := template.ParseFiles("test")
	if err != nil {
		log.Fatal("Parse error:", err)
	}
	// 创建一个将要被写入的文件
	file, err := os.Create("target/output.txt")
	if err != nil {
		panic(err)
	}
	defer file.Close()
	err = t.Execute(file /*os.Stdout*/, entity.User{FirstName: "jin", LastName: "chauncy"})
	if err != nil {
		log.Fatal("Execute error:", err)
	}
}

// 管道，前一个输出作为后一个输入
func pipeOPs() {
	t, err := template.ParseFiles("s17_go_template/template/item.tpl")
	if err != nil {
		log.Fatal("Parse error:", err)
	}
	item := entity.Item{Name: "iPhone", Price: 699.99, Num: 2}
	err = t.Execute(os.Stdout, item)
	if err != nil {
		log.Fatal("Execute error:", err)
	}
}

// 自定义函数
func cusFunc() {
	funcMap := template.FuncMap{
		"fdate": formatDate,
	}

	t := template.New("test").Funcs(funcMap)

	t, err := t.Parse("Today is {{ . | fdate }}.")
	if err != nil {
		log.Fatal("Parse errr:", err)
	}

	err = t.Execute(os.Stdout, time.Now())
	if err != nil {
		log.Fatal("Exeute error:", err)
	}
}

func formatDate(t time.Time) string {
	return t.Format("2006-01-02")
}

func main() {
	// 点动作 {{ .Name }}
	//dotOps()

	// 条件的动作
	//conditionOPs()

	// 模板嵌套
	//nestOps1()
	//nestOps2()

	// 函数
	functionOps()

	// 管道
	//pipeOPs()

	// 自定义函数
	//cusFunc()
}
